home *** CD-ROM | disk | FTP | other *** search
- VERSION 5.00
- Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "COMDLG32.OCX"
- Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "MSCOMCTL.OCX"
- Begin VB.Form frmMain
- BorderStyle = 1 'Fixed Single
- Caption = "TrimmerVB"
- ClientHeight = 8775
- ClientLeft = 60
- ClientTop = 345
- ClientWidth = 10890
- Icon = "frmMain.frx":0000
- LinkTopic = "frmMain"
- MaxButton = 0 'False
- ScaleHeight = 8775
- ScaleWidth = 10890
- StartUpPosition = 2 'CenterScreen
- Begin VB.TextBox txtInstruction
- Appearance = 0 'Flat
- BackColor = &H8000000F&
- BorderStyle = 0 'None
- Height = 1365
- HideSelection = 0 'False
- Left = 7425
- Locked = -1 'True
- MultiLine = -1 'True
- TabIndex = 40
- TabStop = 0 'False
- Text = "frmMain.frx":030A
- Top = 4875
- Width = 3315
- End
- Begin VB.Frame fraPretty
- Enabled = 0 'False
- Height = 4815
- Left = 7305
- TabIndex = 38
- Top = 3525
- Width = 3540
- Begin VB.Timer tmrTimer
- Interval = 1000
- Left = 600
- Top = 4330
- End
- Begin VB.TextBox txtCopyright
- Appearance = 0 'Flat
- BackColor = &H8000000F&
- BorderStyle = 0 'None
- Height = 840
- Left = 975
- Locked = -1 'True
- MultiLine = -1 'True
- TabIndex = 39
- TabStop = 0 'False
- Text = "frmMain.frx":03D5
- Top = 225
- Width = 2490
- End
- Begin MSComDlg.CommonDialog ctrlCommonDialog
- Left = 75
- Top = 4275
- _ExtentX = 847
- _ExtentY = 847
- _Version = 393216
- End
- Begin VB.Line lnAboutSeptum
- X1 = 150
- X2 = 3375
- Y1 = 1125
- Y2 = 1125
- End
- Begin VB.Image imgAbout
- Height = 765
- Left = 150
- Picture = "frmMain.frx":0454
- Stretch = -1 'True
- Top = 225
- Width = 765
- End
- End
- Begin MSComctlLib.StatusBar ctrlStatusBar
- Align = 2 'Align Bottom
- Height = 390
- Left = 0
- TabIndex = 30
- Top = 8385
- Width = 10890
- _ExtentX = 19209
- _ExtentY = 688
- Style = 1
- _Version = 393216
- BeginProperty Panels {8E3867A5-8586-11D1-B16A-00C0F0283628}
- EndProperty
- End
- Begin VB.Frame fraPreviewControl
- Caption = "Video Preview:"
- Height = 2340
- Left = 45
- TabIndex = 25
- Top = 6000
- Width = 7190
- Begin VB.CommandButton cmdSetStop
- Caption = "Set Trim Preview Stop Position"
- Height = 375
- Left = 150
- TabIndex = 9
- ToolTipText = "Selects the ending point of the trim operation."
- Top = 1755
- Width = 3000
- End
- Begin VB.CommandButton cmdSelStart
- Caption = "Set Trim Preview Start Position"
- Height = 375
- Left = 150
- TabIndex = 8
- ToolTipText = "Selects the starting point of the trim operation."
- Top = 1275
- Width = 3000
- End
- Begin VB.Frame fraVideoPreview
- Height = 940
- Left = 3300
- TabIndex = 31
- Top = 1200
- Width = 3765
- Begin VB.Label lblFPS
- Caption = "FPS:"
- Height = 255
- Left = 150
- TabIndex = 37
- Top = 300
- Width = 975
- End
- Begin VB.Label lblFPSValue
- Caption = "0"
- Height = 255
- Left = 1230
- TabIndex = 36
- Top = 300
- Width = 1005
- End
- Begin VB.Label lblStreams
- Caption = "Streams:"
- Height = 255
- Left = 150
- TabIndex = 35
- Top = 540
- Width = 975
- End
- Begin VB.Label lblStreamsValue
- Caption = "0"
- Height = 255
- Left = 1230
- TabIndex = 34
- Top = 540
- Width = 1005
- End
- Begin VB.Label lblVideoStream
- Caption = "Video Stream:"
- Height = 255
- Left = 2250
- TabIndex = 33
- Top = 300
- Width = 1005
- End
- Begin VB.Label lblVideoStreamValue
- Caption = "0"
- Height = 255
- Left = 3330
- TabIndex = 32
- Top = 300
- Width = 255
- End
- End
- Begin VB.CommandButton cmdEnd
- Caption = "&End"
- Height = 375
- Left = 2190
- TabIndex = 6
- ToolTipText = "Move to the last frame."
- Top = 300
- Width = 975
- End
- Begin VB.CommandButton cmdHome
- Caption = "&Home"
- Height = 375
- Left = 150
- TabIndex = 3
- ToolTipText = "Move to the first frame."
- Top = 300
- Width = 975
- End
- Begin VB.CommandButton cmdFwdFrame
- Caption = ">"
- Height = 375
- Left = 1710
- TabIndex = 5
- ToolTipText = "Move Forward one frame."
- Top = 300
- Width = 375
- End
- Begin VB.CommandButton cmdBackFrame
- Caption = "<"
- Height = 375
- Left = 1230
- TabIndex = 4
- ToolTipText = "Move backward one frame."
- Top = 300
- Width = 375
- End
- Begin MSComctlLib.Slider ctrlSlider
- Height = 375
- Left = 30
- TabIndex = 7
- ToolTipText = "Highlighted portion of the timeline represents the selected video which will be 'Trimmed' from the source clip"
- Top = 825
- Width = 7130
- _ExtentX = 12568
- _ExtentY = 661
- _Version = 393216
- Max = 50
- SelectRange = -1 'True
- TextPosition = 1
- End
- Begin VB.Label lblCurrentTimeValue
- Caption = "0"
- Height = 255
- Left = 5070
- TabIndex = 29
- Top = 540
- Width = 1680
- End
- Begin VB.Label lblCurrentTime
- Caption = "Current Time:"
- Height = 255
- Left = 3750
- TabIndex = 28
- Top = 540
- Width = 1125
- End
- Begin VB.Label lblCurrentFrameValue
- Caption = "0"
- Height = 255
- Left = 5070
- TabIndex = 27
- Top = 300
- Width = 1680
- End
- Begin VB.Label lblCurrentFrame
- Caption = "Current Frame:"
- Height = 255
- Left = 3750
- TabIndex = 26
- Top = 300
- Width = 1140
- End
- End
- Begin VB.Frame fraVideoControl
- Caption = "Video Control:"
- Height = 2415
- Left = 45
- TabIndex = 14
- Top = 3525
- Width = 7190
- Begin VB.CommandButton cmdPlayback
- Caption = "&Playback"
- Height = 375
- Left = 150
- TabIndex = 2
- ToolTipText = "Plays back the video using Media Player"
- Top = 1875
- Width = 975
- End
- Begin VB.CommandButton cmdBrowse
- Caption = "&Browse..."
- Height = 375
- Left = 150
- TabIndex = 0
- ToolTipText = "Browse for source media."
- Top = 900
- Width = 975
- End
- Begin VB.CommandButton cmdWrite
- Caption = "&Write"
- Height = 375
- Left = 150
- TabIndex = 1
- ToolTipText = "Exports the trimmed video to an avi file."
- Top = 1380
- Width = 975
- End
- Begin MSComctlLib.ProgressBar ctrlProgress
- Height = 405
- Left = 1230
- TabIndex = 42
- Top = 1350
- Visible = 0 'False
- Width = 5805
- _ExtentX = 10239
- _ExtentY = 714
- _Version = 393216
- Appearance = 1
- End
- Begin VB.Label lblPlaybackFileName
- BorderStyle = 1 'Fixed Single
- Caption = "c:\smart.avi"
- Height = 375
- Left = 1230
- TabIndex = 41
- Top = 1875
- Width = 5805
- End
- Begin VB.Label lblReadFileName
- BorderStyle = 1 'Fixed Single
- Height = 375
- Left = 1230
- TabIndex = 24
- Top = 900
- Width = 5805
- End
- Begin VB.Label lblWriteFileName
- BorderStyle = 1 'Fixed Single
- Caption = "c:\smart.avi"
- Height = 375
- Left = 1230
- TabIndex = 23
- Top = 1380
- Width = 5805
- End
- Begin VB.Label lblStartFrame
- Caption = "Start Frame:"
- Height = 255
- Left = 150
- TabIndex = 22
- Top = 300
- Width = 1095
- End
- Begin VB.Label lblStartFrameValue
- Caption = "0"
- Height = 255
- Left = 1350
- TabIndex = 21
- Top = 300
- Width = 1680
- End
- Begin VB.Label lblStopFrame
- Caption = "Stop Frame:"
- Height = 255
- Left = 3270
- TabIndex = 20
- Top = 300
- Width = 1095
- End
- Begin VB.Label lblStopFrameValue
- Caption = "0"
- Height = 255
- Left = 4380
- TabIndex = 19
- Top = 300
- Width = 1680
- End
- Begin VB.Label lblStartTime
- Caption = "Start Time:"
- Height = 255
- Left = 150
- TabIndex = 18
- Top = 540
- Width = 1095
- End
- Begin VB.Label lblStartTimeValue
- Caption = "0"
- Height = 255
- Left = 1350
- TabIndex = 17
- Top = 540
- Width = 1680
- End
- Begin VB.Label lblStopTime
- Caption = "Stop Time:"
- Height = 255
- Left = 3270
- TabIndex = 16
- Top = 540
- Width = 1095
- End
- Begin VB.Label lblStopTimeValue
- Caption = "0"
- Height = 255
- Left = 4380
- TabIndex = 15
- Top = 540
- Width = 1680
- End
- End
- Begin VB.PictureBox picPreview
- Height = 3225
- Left = 45
- ScaleHeight = 3165
- ScaleWidth = 3480
- TabIndex = 10
- Top = 270
- Width = 3540
- End
- Begin VB.Label lblVideoStopFrame
- Caption = "Video Stop Frame:"
- Height = 240
- Left = 7305
- TabIndex = 13
- Top = 0
- Width = 3480
- End
- Begin VB.Label lblVideoStartFrame
- Caption = "Video Start Frame:"
- Height = 240
- Left = 3660
- TabIndex = 12
- Top = 0
- Width = 3555
- End
- Begin VB.Label lblVideoCurrentFrame
- Caption = "Current Video Frame:"
- Height = 240
- Left = 45
- TabIndex = 11
- Top = 0
- Width = 1515
- End
- Begin VB.Image imgPreviewStop
- BorderStyle = 1 'Fixed Single
- Height = 3225
- Left = 7305
- Stretch = -1 'True
- Top = 270
- Width = 3540
- End
- Begin VB.Image imgPreviewStart
- BorderStyle = 1 'Fixed Single
- Height = 3225
- Left = 3675
- Stretch = -1 'True
- Top = 270
- Width = 3540
- End
- Attribute VB_Name = "frmMain"
- Attribute VB_GlobalNameSpace = False
- Attribute VB_Creatable = False
- Attribute VB_PredeclaredId = True
- Attribute VB_Exposed = False
- '*******************************************************************************
- '* This is a part of the Microsoft DXSDK Code Samples.
- '* Copyright (C) 1999-2001 Microsoft Corporation.
- '* All rights reserved.
- '* This source code is only intended as a supplement to
- '* Microsoft Development Tools and/or SDK documentation.
- '* See these sources for detailed information regarding the
- '* Microsoft samples programs.
- '*******************************************************************************
- Option Explicit
- Option Base 0
- Option Compare Text
- Private m_dblFPS As Double 'evaluates to the rate of the currently loaded clip (frames per second)
- Private m_boolDirty As Boolean 'evaluates to true if the UI needs repainted, and the poster frame needs regrabbed
- Private m_nFrameCount As Long 'evaluates to the number of frames in the current clip
- Private m_bstrFileName As String 'evaluates to the filename of the currently loaded clip
- Private m_boolLoaded As Boolean 'evaluates to true if we have anything loaded
- Private m_boolHasAudio As Boolean 'evaluates to true if the current clip has audio
- Private m_objMediaDet As MediaDet 'evaluates to a media detector object which is used to work with stream information
- Private Const VIDEO_CLSID As String = "{73646976-0000-0010-8000-00AA00389B71}" 'video clsid
- Private Const AUDIO_CLSID As String = "{73647561-0000-0010-8000-00AA00389B71}" 'audio clsid
- Private Const POSTER_FRAME_FILENAME As String = "bitmap.bmp" ' filename to write out poster frames for loading into the UI
- Private Const MPLAYER2_INSTALL_LOCATION As String = "c:\program files\windows media player\mplayer2.exe" 'mplayer2.exe
- ' **************************************************************************************************************************************
- ' * PRIVATE INTERFACE- FORM EVENTS
- ' ******************************************************************************************************************************
- ' * procedure name: Form_Load
- ' * procedure description: Occurs when a form is loaded.
- ' *
- ' ******************************************************************************************************************************
- Private Sub Form_Load()
- On Local Error GoTo ErrLine
-
- 'disable ui
- ctrlSlider.Enabled = False
- cmdHome.Enabled = False
- cmdEnd.Enabled = False
- cmdBrowse.Enabled = True
- cmdWrite.Enabled = False
- cmdSelStart.Enabled = False
- cmdSetStop.Enabled = False
- cmdBackFrame.Enabled = False
- cmdFwdFrame.Enabled = False
- cmdPlayback.Enabled = False
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
- ' ******************************************************************************************************************************
- ' * procedure name: Form_Load
- ' * procedure description: Occurs when a form is loaded.
- ' *
- ' ******************************************************************************************************************************
- Private Sub Form_Unload(Cancel As Integer)
- On Local Error GoTo ErrLine
-
- 'ensure the temporary file has been deleted
- If File_Exists(GetTempDirectory & POSTER_FRAME_FILENAME) Then _
- Call File_Delete(GetTempDirectory & POSTER_FRAME_FILENAME, False, False, False)
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: Form_Initialize
- ' * procedure description: Occurs when an application creates an instance of a Form, MDIForm, or class.
- ' *
- ' ******************************************************************************************************************************
- Private Sub Form_Initialize()
- On Local Error GoTo ErrLine
-
- 'initalize module-level variable(s)
- Set m_objMediaDet = New MediaDet
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: Form_Terminate
- ' * procedure description: Occurs when all references to an instance of a Form, MDIForm, or class are removed from memory.
- ' *
- ' ******************************************************************************************************************************
- Private Sub Form_Terminate()
- On Local Error GoTo ErrLine
-
- 'terminate module-level object(s0
- If Not m_objMediaDet Is Nothing Then Set m_objMediaDet = Nothing
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
-
- ' **************************************************************************************************************************************
- ' * PRIVATE INTERFACE- CONTROL EVENTS
- ' ******************************************************************************************************************************
- ' * procedure name: cmdPlayback_Click
- ' * procedure description: Occurs when the user presses and then releases a mouse button over an object.
- ' *
- ' ******************************************************************************************************************************
- Private Sub cmdPlayback_Click()
- Dim nResultant As Long
- Dim bstrFileName As String
- Dim bstrDirectoryName As String
- On Local Error GoTo ErrLine
-
- 'verify that the export location is valid
- If File_Exists(lblPlaybackFileName.Caption) Then
- 'obtain the filename & directory name from the label
- If InStr(1, lblPlaybackFileName.Caption, "\") > 0 Then
- bstrFileName = Right(lblPlaybackFileName.Caption, Len(lblPlaybackFileName.Caption) - InStrRev(lblPlaybackFileName.Caption, "\"))
- bstrDirectoryName = Replace(lblPlaybackFileName.Caption, bstrFileName, vbNullString)
- If Right(bstrDirectoryName, 1) = "\" Then bstrDirectoryName = Left(bstrDirectoryName, Len(bstrDirectoryName) - 1)
- ElseIf InStr(1, lblPlaybackFileName.Caption, "/") > 0 Then
- bstrFileName = Right(lblPlaybackFileName.Caption, Len(lblPlaybackFileName.Caption) - InStrRev(lblPlaybackFileName.Caption, "/"))
- bstrDirectoryName = Replace(lblPlaybackFileName.Caption, bstrFileName, vbNullString)
- If Right(bstrDirectoryName, 1) = "/" Then bstrDirectoryName = Left(bstrDirectoryName, Len(bstrDirectoryName) - 1)
- End If
- nResultant = File_Execute(bstrDirectoryName, bstrFileName)
- End If
-
- 'verify the operation succeeded,
- 'if it did not then dislay an error dialog
- If nResultant = 0 Then
- MsgBox "The file could not be found on the specified path: " & _
- CStr(lblPlaybackFileName.Caption), vbExclamation + vbApplicationModal
- End If
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
- ' ******************************************************************************************************************************
- ' * procedure name: cmdBackFrame_Click
- ' * procedure description: Occurs when the user presses and then releases a mouse button over an object.
- ' *
- ' ******************************************************************************************************************************
- Private Sub cmdBackFrame_Click()
- Dim v As Long
- On Local Error GoTo ErrLine
-
- v = CLng(ctrlSlider.Value)
- v = (v - 1): If v < 0 Then v = 0
- ctrlSlider.Value = v: m_boolDirty = True 'reset to dirty
- lblCurrentFrameValue.Caption = CStr(Trim(Str(ctrlSlider.Value)))
- If m_dblFPS <> 0 Then lblCurrentTimeValue.Caption = CStr(Trim(Str(ctrlSlider.Value / m_dblFPS)))
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: cmdFwdFrame_Click
- ' * procedure description: Occurs when the user presses and then releases a mouse button over an object.
- ' *
- ' ******************************************************************************************************************************
- Private Sub cmdFwdFrame_Click()
- Dim v As Long
- On Local Error GoTo ErrLine
-
- v = CLng(ctrlSlider.Value): v = (v + 1)
- If v > m_nFrameCount Then v = m_nFrameCount
- ctrlSlider.Value = v: m_boolDirty = True 'reset to dirty
- lblCurrentFrameValue.Caption = CStr(Trim(Str(ctrlSlider.Value)))
- If m_dblFPS <> 0 Then lblCurrentTimeValue.Caption = CStr(Trim(Str(ctrlSlider.Value / m_dblFPS)))
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: cmdEnd_Click
- ' * procedure description: Occurs when the user presses and then releases a mouse button over an object.
- ' *
- ' ******************************************************************************************************************************
- Private Sub cmdEnd_Click()
- On Local Error GoTo ErrLine
-
- ctrlSlider.Value = m_nFrameCount: m_boolDirty = True 'reset to dirty
- lblCurrentFrameValue.Caption = CStr(Trim(Str(ctrlSlider.Value)))
- If m_dblFPS <> 0 Then lblCurrentTimeValue.Caption = CStr(Trim(Str(ctrlSlider.Value / m_dblFPS)))
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: cmdHome_Click
- ' * procedure description: Occurs when the user presses and then releases a mouse button over an object.
- ' *
- ' ******************************************************************************************************************************
- Private Sub cmdHome_Click()
- On Local Error GoTo ErrLine
-
- ctrlSlider.Value = 0: m_boolDirty = True 'reset to dirty
- lblCurrentFrameValue.Caption = CStr(Trim(Str(ctrlSlider.Value)))
- If m_dblFPS <> 0 Then lblCurrentTimeValue.Caption = CStr(Trim(Str(ctrlSlider.Value / m_dblFPS)))
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: cmdBrowse_Click
- ' * procedure description: Occurs when the user presses and then releases a mouse button over an object.
- ' *
- ' ******************************************************************************************************************************
- Private Sub cmdBrowse_Click()
- Dim nCount As Long
- Dim bstrWriteName As String
- Dim bstrStreamType As String
- Dim intVideoStream As Integer
- Dim objMediaDet As MediaDet
- On Local Error Resume Next
-
- 'display the common 'open' dialog
- ctrlCommonDialog.CancelError = True
- ctrlCommonDialog.Filter = "Video Files (*.avi;*.mov)|*.avi;*.mov|"
- ctrlCommonDialog.ShowOpen
-
- If ctrlCommonDialog.FileName <> vbNullString Then
- 'assign the filename to the MediaDet
- If File_Exists(ctrlCommonDialog.FileName) Then
- Set objMediaDet = New MediaDet 'instantiate
- objMediaDet.FileName = ctrlCommonDialog.FileName
- Else: Exit Sub
- End If
- Else: Exit Sub
- End If
-
- 'fashion a new name to write out
- lblReadFileName.Caption = ctrlCommonDialog.FileName
- bstrWriteName = Left$(ctrlCommonDialog.FileName, Len(ctrlCommonDialog.FileName) - 4) + "_T.avi"
- lblWriteFileName.Caption = bstrWriteName: lblPlaybackFileName.Caption = bstrWriteName
-
- 'see if there's any video and audio
- m_boolHasAudio = False
-
- intVideoStream = -1
- For nCount = 0 To objMediaDet.OutputStreams - 1
- 'get the current stream
- objMediaDet.CurrentStream = nCount
- 'obtain the type of stream (audio/video)
- bstrStreamType = objMediaDet.StreamTypeB
- 'elect an action based on the stream type
- If bstrStreamType = VIDEO_CLSID Then
- 'video stream
- intVideoStream = nCount
- Call SetDuration(objMediaDet.StreamLength, objMediaDet.FrameRate)
- ElseIf bstrStreamType = AUDIO_CLSID Then
- 'audio stream
- m_boolHasAudio = True
- End If
- Next
-
- 'default error
- If intVideoStream = -1 Then
- MsgBox "The Selected File does not contain a video stream.", vbExclamation
- Exit Sub
- End If
-
- 'assign the instance to module-level
- If Not objMediaDet Is Nothing Then Set m_objMediaDet = objMediaDet
- If ctrlCommonDialog.FileName <> vbNullString Then m_bstrFileName = ctrlCommonDialog.FileName
-
- 'assign the stream info the the ui
- lblStreamsValue.Caption = Trim(CStr(objMediaDet.OutputStreams))
- lblVideoStreamValue.Caption = Trim(Str(intVideoStream))
-
- ' get a poster frame to start out with
- objMediaDet.WriteBitmapBits 0, picPreview.Width / 15, picPreview.Height / 15, GetTempDirectory + POSTER_FRAME_FILENAME
- picPreview.Picture = LoadPicture(GetTempDirectory + POSTER_FRAME_FILENAME)
-
- 'assign state
- m_boolLoaded = True
- m_boolDirty = False
-
- 'reset scrollbar
- ctrlSlider.Value = 0
- Call ctrlSlider_Scroll
-
- 'set start/stop
- Call cmdSelStart_Click
- Call cmdSetStop_Click
-
- 'enable ui
- ctrlSlider.Enabled = True
- cmdHome.Enabled = True
- cmdEnd.Enabled = True
- cmdBrowse.Enabled = True
- cmdWrite.Enabled = True
- cmdSelStart.Enabled = True
- cmdSetStop.Enabled = True
- cmdBackFrame.Enabled = True
- cmdFwdFrame.Enabled = True
-
- 'clean-up & dereference
- If Not objMediaDet Is Nothing Then Set objMediaDet = Nothing
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: cmdSelStart_Click
- ' * procedure description: Occurs when the user presses and then releases a mouse button over an object.
- ' * Set the start frame and show a frame for it.
- ' ******************************************************************************************************************************
- Private Sub cmdSelStart_Click()
- On Local Error GoTo ErrLine
-
- If Not m_boolLoaded Then Exit Sub
-
- 'setup the ui
- lblStartTimeValue.Caption = Trim(Str(GetCurrentPos))
- lblStartFrameValue.Caption = Trim(Str(ctrlSlider.Value))
- lblVideoStartFrame.Caption = "Video Start Frame:" & Space(2) & Trim(Str(Round(GetCurrentPos, 2)))
-
- 'setup the slider
- If ctrlSlider.Value > ctrlSlider.SelStart Then
- ctrlSlider.SelStart = ctrlSlider.Value
- ctrlSlider.SelLength = 0
- Else: ctrlSlider.SelStart = ctrlSlider.Value
- End If
-
- 'reset to dirty
- m_boolDirty = True
- 'call the timer event proc
- Call tmrTimer_Timer
- 'load the picture into the preview pane
- imgPreviewStart.Picture = LoadPicture(GetTempDirectory + POSTER_FRAME_FILENAME)
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: cmdSetStop_Click
- ' * procedure description: Occurs when the user presses and then releases a mouse button over an object.
- ' * Set the stop frame and show a frame for it
- ' ******************************************************************************************************************************
- Private Sub cmdSetStop_Click()
- On Local Error GoTo ErrLine
-
- If Not m_boolLoaded Then Exit Sub
-
- 'setup the ui
- lblStopTimeValue.Caption = Trim(Str(GetCurrentPos))
- lblStopFrameValue.Caption = Trim(Str(ctrlSlider.Value))
- lblVideoStopFrame.Caption = "Video Stop Frame:" & Space(2) & Trim(Str(Round(GetCurrentPos, 2)))
-
- 'setup the slider
- If ctrlSlider.Value < ctrlSlider.SelStart Then
- ctrlSlider.SelStart = ctrlSlider.Value
- ctrlSlider.SelLength = 0
- Else
- ctrlSlider.SelLength = ctrlSlider.Value - ctrlSlider.SelStart
- End If
-
- 'reset to dirty
- m_boolDirty = True
- 'call the timer event proc
- Call tmrTimer_Timer
- 'load the picture into the preview pane
- imgPreviewStop.Picture = LoadPicture(GetTempDirectory + POSTER_FRAME_FILENAME)
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: cmdWrite_Click
- ' * procedure description: Occurs when the user presses and then releases a mouse button over an object.
- ' * Construct a timeline and write out the file using smart recompression.
- ' ******************************************************************************************************************************
- Private Sub cmdWrite_Click()
- Dim nState As Long
- Dim nReturnCode As Long
- Dim dblPosition As Double
- Dim dblDuration As Double
- Dim dblStartTime As Double
- Dim dblStopTime As Double
-
- Dim objMediaEvent As IMediaEvent
- Dim objMediaPosition As IMediaPosition
- Dim objFilterGraphManager As FilgraphManager
-
- Dim objTimeline As AMTimeline
- Dim objSourceObj As AMTimelineObj
- Dim objTrackObject As AMTimelineObj
- Dim objAudioGroupObj As AMTimelineObj
- Dim objVideoGroupObject As AMTimelineObj
-
- Dim objSource As AMTimelineSrc
- Dim objTrack As AMTimelineTrack
- Dim objAudioGroup As AMTimelineGroup
- Dim objVideoGroup As AMTimelineGroup
- Dim objAudioComposition As AMTimelineComp
- Dim objVideoComposition As AMTimelineComp
- Dim objSmartRenderEngine As New SmartRenderEngine
- On Local Error GoTo ErrLine
-
-
- 'disable the form
- Call DisableEverything
-
-
- 'instantiate a timeline
- Set objTimeline = New AMTimeline
- 'create an empty node on the timeline for the video
- objTimeline.CreateEmptyNode objVideoGroupObject, TIMELINE_MAJOR_TYPE_GROUP
- 'derive the video group object from the timeline object
- Set objVideoGroup = objVideoGroupObject
- 'set the media type of the video group
- objVideoGroup.SetMediaTypeForVB 0
- 'append the video group to the timeline
- objTimeline.AddGroup objVideoGroup
-
-
-
- 'create an empty node on the timeline for the track
- objTimeline.CreateEmptyNode objTrackObject, TIMELINE_MAJOR_TYPE_TRACK
- 'obtain a composition from the video group
- Set objVideoComposition = objVideoGroup
- 'inset the track into the composition
- objVideoComposition.VTrackInsBefore objTrackObject, -1
- 'derive the track object
- Set objTrack = objTrackObject
-
-
-
- 'create an empty node on the timeline for the source clip
- objTimeline.CreateEmptyNode objSourceObj, TIMELINE_MAJOR_TYPE_SOURCE
- 'derive the source clip from the timeline object
- Set objSource = objSourceObj
- 'query the ui for duration times
- If m_dblFPS > 0 Then
- dblDuration = ctrlSlider.SelLength / m_dblFPS
- dblStartTime = ctrlSlider.SelStart / m_dblFPS
- dblStopTime = dblStartTime + dblDuration
- Else
- dblDuration = ctrlSlider.SelLength / 15
- dblStartTime = ctrlSlider.SelStart / 15
- dblStopTime = dblStartTime + dblDuration
- End If
- 'verify start/stop times
- If dblStopTime = 0 Then
- dblStopTime = 1
- ElseIf dblStartTime = dblStopTime Then
- dblStopTime = dblStartTime + 1
- End If
- 'set the start/stop times to the source clip
- objSourceObj.SetStartStop2 0, dblDuration
- objSource.SetMediaTimes2 dblStartTime, dblStopTime
- objSource.SetMediaName m_bstrFileName
- 'append the source clip to the track
- objTrack.SrcAdd objSourceObj
-
-
-
- If m_boolHasAudio Then
- 'create an empty node on the timeline for the audio group
- objTimeline.CreateEmptyNode objAudioGroupObj, TIMELINE_MAJOR_TYPE_GROUP
- 'derive the audio group form the timeline object
- Set objAudioGroup = objAudioGroupObj
- 'set the media type of the audio group
- objAudioGroup.SetMediaTypeForVB 1
- 'append the group to the timeline
- objTimeline.AddGroup objAudioGroup
-
- 'create an empty node on the timeline for the track
- objTimeline.CreateEmptyNode objTrackObject, TIMELINE_MAJOR_TYPE_TRACK
- 'derive a composition from the audio group
- Set objAudioComposition = objAudioGroup
- 'insetr the track into the composition
- objAudioComposition.VTrackInsBefore objTrackObject, -1
- 'derive a track object from the timeline object
- Set objTrack = objTrackObject
-
- 'create an empty node for the source clip
- objTimeline.CreateEmptyNode objSourceObj, TIMELINE_MAJOR_TYPE_SOURCE
- 'derive a source object from the timeline object
- Set objSource = objSourceObj
- 'set the start/stop times from the ui
- objSourceObj.SetStartStop2 0, dblDuration
- objSource.SetMediaTimes2 dblStartTime, dblStopTime
- objSource.SetMediaName m_bstrFileName
- 'add the source to the track
- objTrack.SrcAdd objSourceObj
- End If
-
-
-
- ' set the recompression format of the video group
- objVideoGroup.SetRecompFormatFromSource objSource
- 'set the timeline to the render engine
- objSmartRenderEngine.SetTimelineObject objTimeline
- 'connect-up the render engine
- objSmartRenderEngine.ConnectFrontEnd
- 'obtain a reference to the filter graph for the timeline
- objSmartRenderEngine.GetFilterGraph objFilterGraphManager
- 'add a file writer and mux filter to the filtergraph
- AddFileWriterAndMux objFilterGraphManager, lblWriteFileName.Caption
- 'render the output pins & prepare to proceed with smart render
- RenderGroupPins objSmartRenderEngine, objTimeline
- 'run the graph, in turn creating the given file
- objFilterGraphManager.Run
- 'obtain a media event from the filtergraph manager
- Set objMediaEvent = objFilterGraphManager
- 'obtain the position within the graph
- Set objMediaPosition = objFilterGraphManager
-
-
-
- 'display the progress during render
- ctrlProgress.Value = 0
- ctrlProgress.Visible = True: lblWriteFileName.Visible = False
- Do: DoEvents
- 'set the progress bar's current position
- If dblDuration > 0 Then
- If Round(ctrlProgress.Value, 0) = 100 Then
- ctrlProgress.Value = 0
- Else: ctrlProgress.Value = (ctrlProgress.Value + 1)
- End If
- End If
- 'wait until the file has been written, and exit
- If Not objMediaEvent Is Nothing Then
- Call objMediaEvent.WaitForCompletion(100, nReturnCode)
- If nReturnCode = 1 Then Exit Do
- Else: Exit Do
- End If
- Loop
- Cleanup:
-
- 'clean-up code
- ctrlProgress.Value = 100
- ctrlProgress.Visible = False: lblWriteFileName.Visible = True
- cmdWrite.Enabled = True: Call EnableEverything
-
- 'scrap the render engine
- If Not objSmartRenderEngine Is Nothing Then objSmartRenderEngine.ScrapIt
- 'clean-up & dereference quartz object(s)
- If Not objMediaEvent Is Nothing Then Set objMediaEvent = Nothing
- If Not objMediaPosition Is Nothing Then Set objMediaPosition = Nothing
- If Not objFilterGraphManager Is Nothing Then Set objFilterGraphManager = Nothing
- 'clean-up & dereference dexter timeline object(s)
- If Not objTimeline Is Nothing Then Set objTimeline = Nothing
- If Not objSourceObj Is Nothing Then Set objSourceObj = Nothing
- If Not objTrackObject Is Nothing Then Set objTrackObject = Nothing
- If Not objAudioGroupObj Is Nothing Then Set objAudioGroupObj = Nothing
- If Not objVideoGroupObject Is Nothing Then Set objVideoGroupObject = Nothing
- 'clean-up & dereference dexter timeline object(s)
- If Not objTrack Is Nothing Then Set objTrack = Nothing
- If Not objSource Is Nothing Then Set objSource = Nothing
- If Not objAudioGroup Is Nothing Then Set objAudioGroup = Nothing
- If Not objVideoGroup Is Nothing Then Set objVideoGroup = Nothing
- If Not objAudioComposition Is Nothing Then Set objAudioComposition = Nothing
- If Not objVideoComposition Is Nothing Then Set objVideoComposition = Nothing
- If Not objSmartRenderEngine Is Nothing Then Set objSmartRenderEngine = Nothing
- Exit Sub
-
- ErrLine:
- Select Case Err.Number
- Case 5 'Invalid procedure call or argument
- Call MsgBox("Error creating file. Verify that the start/stop times are valid before continuing.", vbExclamation + vbApplicationModal)
- Err.Clear: GoTo Cleanup
- Case 287 'Application-defined or object-defined error
- Err.Clear: Resume Next
- Case -2147024864 'The process cannot access the file because it is being used by another process.
- Call MsgBox(Err.Description, vbExclamation + vbApplicationModal): Err.Clear: GoTo Cleanup
- Case Else 'unknown error
- Call MsgBox(Err.Description, vbExclamation + vbApplicationModal): Err.Clear: GoTo Cleanup
- End Select
- Exit Sub
- End Sub
-
- ' ******************************************************************************************************************************
- ' * procedure name: ctrlSlider_Scroll
- ' * procedure description: ctrlSlider scroll event.
- ' *
- ' ******************************************************************************************************************************
- Private Sub ctrlSlider_Scroll()
- On Local Error GoTo ErrLine
-
- If m_boolLoaded Then
- 'reset the label caption's
- lblCurrentFrameValue.Caption = CStr(Trim(Str(ctrlSlider.Value)))
- If m_dblFPS <> 0 Then lblCurrentTimeValue.Caption = CStr(Trim(Str(ctrlSlider.Value / m_dblFPS)))
- 'reset to dirty
- m_boolDirty = True
- End If
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
- ' ******************************************************************************************************************************
- ' * procedure name: tmrTimer_Timer
- ' * procedure description: Occurs when a preset interval for a Timer control has elapsed.
- ' * If the UI is dirty, go grab a video frame and draw it.
- ' ******************************************************************************************************************************
- Private Sub tmrTimer_Timer()
- On Local Error GoTo ErrLine
-
- If m_boolDirty Then
- 'reset to not dirty
- m_boolDirty = False
- 'write out the current frame to the given bitmap file
- m_objMediaDet.WriteBitmapBits GetCurrentPos, picPreview.Width / 15, picPreview.Height / 15, GetTempDirectory + POSTER_FRAME_FILENAME
- 'load the picture into the preview pane
- picPreview.Picture = LoadPicture(GetTempDirectory + POSTER_FRAME_FILENAME)
- End If
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
-
- ' **************************************************************************************************************************************
- ' * PRIVATE INTERFACE- PROCEDURES
- ' ******************************************************************************************************************************
- ' * procedure name: EnableEverything
- ' * procedure description: Enables most controls on the form.
- ' *
- ' ******************************************************************************************************************************
- Private Sub EnableEverything()
- On Local Error GoTo ErrLine
-
- 'update ui
- ctrlSlider.Enabled = True
- cmdBrowse.Enabled = True
- cmdWrite.Enabled = True
- cmdSelStart.Enabled = True
- cmdSetStop.Enabled = True
- cmdBackFrame.Enabled = True
- cmdFwdFrame.Enabled = True
- cmdPlayback.Enabled = True
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: DisableEverything
- ' * procedure description: Disables most controls on the form.
- ' *
- ' ******************************************************************************************************************************
- Private Sub DisableEverything()
- On Local Error GoTo ErrLine
-
- 'update ui
- ctrlSlider.Enabled = False
- cmdBrowse.Enabled = False
- cmdWrite.Enabled = False
- cmdSelStart.Enabled = False
- cmdSetStop.Enabled = False
- cmdBackFrame.Enabled = False
- cmdFwdFrame.Enabled = False
- cmdPlayback.Enabled = False
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: SetDuration
- ' * procedure description: Sets the status within the context of the ui given the duration and the rate.
- ' *
- ' ******************************************************************************************************************************
- Private Sub SetDuration(dblDuration As Double, dblFPS As Double)
- On Local Error GoTo ErrLine
-
- 'set module-level data
- m_dblFPS = dblFPS
- m_nFrameCount = (dblDuration * dblFPS)
-
- 'setup / update the UI
- ctrlSlider.SelStart = 0
- ctrlSlider.SelLength = 0
- ctrlSlider.Min = 0
- ctrlSlider.Max = m_nFrameCount
- ctrlSlider.LargeChange = (m_nFrameCount / 10)
- ctrlSlider.SmallChange = (m_nFrameCount / 100)
- ctrlSlider.TickFrequency = 100
- lblStartTimeValue.Caption = 0
- lblStopTimeValue.Caption = 0
- lblFPSValue.Caption = Trim(Str(Format(dblFPS, "##.##")))
- Exit Sub
-
- ErrLine:
- Err.Clear
- Exit Sub
- End Sub
-
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: GetDuration
- ' * procedure description: Returns the duration of the loaded media given the frame count divided by the rate.
- ' *
- ' ******************************************************************************************************************************
- Private Function GetDuration() As Double
- On Local Error GoTo ErrLine
-
- If m_dblFPS = 0 Then Exit Function
- GetDuration = CDbl((m_nFrameCount / m_dblFPS))
- Exit Function
-
- ErrLine:
- Err.Clear
- Exit Function
- End Function
-
-
-
- ' ******************************************************************************************************************************
- ' * procedure name: GetCurrentPos
- ' * procedure description: Returns the current position given the slider's value divided by the rate.
- ' *
- ' ******************************************************************************************************************************
- Private Function GetCurrentPos() As Double
- On Local Error GoTo ErrLine
-
- If m_dblFPS = 0 Then Exit Function
- If IsNumeric(ctrlSlider.Value) Then
- GetCurrentPos = (ctrlSlider.Value / m_dblFPS)
- End If
- Exit Function
-
- ErrLine:
- Err.Clear
- Exit Function
- End Function
-